package cn.kent.simple;

import java.util.Stack;

/**
 * 232. 用栈实现队列
 * 仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作（push、pop、peek、empty）
 */
public class MyQueue {
    public static void main(String[] args) {
        MyQueue queue = new MyQueue();
        System.out.println(queue.empty());
        queue.push(1);
        queue.push(2);
        queue.push(3);
        System.out.println("pop:" + queue.pop());
        System.out.println(queue.empty());
        System.out.println("peek:" + queue.peek());
        System.out.println("pop:" + queue.pop());
        System.out.println("pop:" + queue.pop());
    }

    // 新建两个栈，一个用于模拟队列，一个临时使用，例如push的时候，从stack拿数据然后把值放入，再覆盖stack
    private Stack<Integer> stack;
    private Stack<Integer> tStack;

    public MyQueue() {
        stack = new Stack<>();
        tStack = new Stack<>();
    }

    // 将元素 x 推到队列的末尾
    public void push(int x) {
        // 不存在栈满的情况，所以不用判断
        // push和pop总共有一个麻烦的，我选push麻烦->pop方便，peek方便
        // 以下逻辑为循环两次，即倒置两次
        tStack = new Stack<>();
        while (!stack.isEmpty()) {
            tStack.push(stack.pop());
        }
        stack.push(x);
        while (!tStack.isEmpty()) {
            stack.push(tStack.pop());
        }
    }

    // 从队列的开头移除并返回元素
    public int pop() {
        return stack.pop();
    }

    // 将开头的元素返回，但不移除
    public int peek() {
        return stack.peek();
    }

    // 判断队列是否为空
    public boolean empty() {
        return stack.isEmpty();
    }
}
